import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioSocketChannel;

import mysql.cs.ComAndPackManager;
import mysql.cs.QueryComManager;
import mysql.cs.packet.QueryResField41Packet;
import mysql.cs.packet.QueryResHeaderPacket;
import mysql.cs.prop.CurrentOp;
import mysql.socket.MysqlNettyConnect;

import java.net.InetSocketAddress;


/**
 * @ClassName Main
 * @Description TODO
 * @Author fengk
 * @Date 2018/8/28
 */

public class Main {
//    ComAndPackManager comAndPackManager=ComAndPackManager.newInstance("root","123456");
//    QueryComManager queryComManager=new QueryComManager();
//    @ChannelHandler.Sharable
//    public class TestHandler extends SimpleChannelInboundHandler<ByteBuf> {
//        @Override
//        public void channelRead0(ChannelHandlerContext ctx, ByteBuf byteBuf) throws Exception {
//            ByteBuf byteBuf1M=comAndPackManager.getPool();
//            byteBuf1M.writeBytes(byteBuf);
//
//            if(comAndPackManager.getCurrentOp()==CurrentOp.QUERYSQL||comAndPackManager.getCurrentOp()==CurrentOp.QUERYSQLFIELD){
//                queryComManager.encode(byteBuf1M,comAndPackManager);
//                if(comAndPackManager.getCurrentOp()==CurrentOp.QUERYSQLFIELD||comAndPackManager.getCurrentOp()==CurrentOp.QUERYSQLDATA){
//                    ctx.channel().writeAndFlush(comAndPackManager.binlogDumpCommandWithID1AndPos4Packet("mysql-bin.000008"));
//                    comAndPackManager.setCurrentOp(CurrentOp.BINLOGDUMP);
//                }
//
//            }else if(comAndPackManager.getCurrentOp()==CurrentOp.BINLOGDUMP){
//                while(byteBuf1M.readableBytes()>4){
//                    byteBuf1M.markReaderIndex();
//                    int length=byteBuf1M.readMediumLE();
//                    byte seqid=byteBuf1M.readByte();
//
//                    if(byteBuf1M.readableBytes()<length){
//                        byteBuf1M.resetReaderIndex();
//                        break;
//                    }
//                    byte[] data=new byte[length];
//                    //direct to stack
//                    byteBuf1M.readBytes(data);
//                    System.out.print("1111111111111111111111111111111111111111111");
//                }
//
//            }else{
//                while (byteBuf1M.readableBytes()>4){
//                    byteBuf1M.markReaderIndex();
//                    int length=byteBuf1M.readMediumLE();
//                    byte seqid=byteBuf1M.readByte();
//
//                    if(byteBuf1M.readableBytes()<length){
//                        byteBuf1M.resetReaderIndex();
//                        break;
//                    }
//                    byte[] data=new byte[length];
//                    //direct to stack
//                    byteBuf1M.readBytes(data);
//
//
//
//
//
//                    //seqid +++++++
//                    comAndPackManager.setCurrLength(length);
//                    comAndPackManager.setCurrSeq(seqid);
//
//                    if(data[0]==(byte)0x0a){
//                        comAndPackManager.HandshakeV10EncodeAndSetRES(data);
//                        ctx.channel().writeAndFlush(comAndPackManager.handshakeResponse41RES());
//                        comAndPackManager.setCurrentOp(CurrentOp.LOGIN);
//                    }else if(data[0]==(byte)0xff){
//                        System.out.println(comAndPackManager.ErrorPacketEncode(data).toString());
//                    }else if(data[0]==(byte)0x00){
//                        System.out.println(comAndPackManager.OKPacketEncode(data).toString());
//                        switch (comAndPackManager.getCurrentOp()){
//                            case LOGIN:
//                                ctx.channel().writeAndFlush(comAndPackManager.queryCommandPacket("SET @master_binlog_checksum='NONE'"));
//                                comAndPackManager.setCurrentOp(CurrentOp.QUERYCOMMAND);
//                                break;
//                            case QUERYCOMMAND:
//                                ctx.channel().writeAndFlush(comAndPackManager.initDBCommandPacket("mysql"));
//                                comAndPackManager.setCurrentOp(CurrentOp.INITDB);
//                                break;
//                            case INITDB:
//                                ctx.channel().writeAndFlush(comAndPackManager.queryCommandPacket("select * from user"));
//                                comAndPackManager.setCurrentOp(CurrentOp.QUERYSQL);
//                                break;
//                            case QUIT:
//                                // (@--@)
//                            default:
//                                System.out.println("进入了不该进入的地方");
//                                break;
//
//                        }
//                    }
//                }
//            }
//
//
//        }
//        @Override
//        public void channelReadComplete(ChannelHandlerContext ctx) throws Exception{
//            System.out.println("\nserver read complete!");
//        }
//        @Override
//        public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause){
//            cause.printStackTrace();
//            ctx.close();
//        }
//
//    }
//    public void start() throws InterruptedException {
//        EventLoopGroup group =new NioEventLoopGroup();
//        try{
//
//            Bootstrap b=new Bootstrap();
//
//            b.group(group)
//                    .channel(NioSocketChannel.class)
//                    .option(ChannelOption.SO_KEEPALIVE, true)
//                    .option(ChannelOption.TCP_NODELAY,true)
//                    .handler(new ChannelInitializer<SocketChannel>() {
//                        @Override
//                        public void initChannel(SocketChannel ch) throws Exception{
//
//                            ch.pipeline().addLast(new TestHandler());
//                        }
//                    });
//
//            ChannelFuture f=b.connect("192.168.0.199",33888);
//
//            try{
//                f.sync();
//            }catch (Exception i){
//                i.printStackTrace();
//            }
//
//
//           f.channel().closeFuture().sync();
//
//        }catch (Exception e) {
//         e.printStackTrace();
//        }finally{
//
//            group.shutdownGracefully().sync();
//        }
//    }

    public static void main(String[] argc) throws Exception {
//        try {
//            new Main().start();
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }

        MysqlNettyConnect mysqlNettyConnect=new MysqlNettyConnect(new InetSocketAddress("192.168.106.174",3306),"root","123456");
        mysqlNettyConnect.connect();

    }
}
